package ve.usb.ddp;

import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.codec.GifImage;
import java.awt.Color;
import java.awt.Paint;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.math.BigInteger;
import java.net.URL;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import ve.usb.cohesion.runtime.CohesionAction;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import ve.usb.cohesion.runtime.HibernateUtil;
import ve.usb.ddp.hibernate.*;

import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
import org.apache.catalina.connector.Request;
import org.jCharts.axisChart.AxisChart;
import org.jCharts.axisChart.customRenderers.axisValue.renderers.ValueLabelPosition;
import org.jCharts.axisChart.customRenderers.axisValue.renderers.ValueLabelRenderer;
import org.jCharts.chartData.AxisChartDataSet;
import org.jCharts.chartData.DataSeries;
import org.jCharts.chartData.PieChartDataSet;
import org.jCharts.chartData.interfaces.IAxisDataSeries;
import org.jCharts.encoders.JPEGEncoder;
import org.jCharts.encoders.PNGEncoder;
import org.jCharts.encoders.ServletEncoderHelper;
import org.jCharts.nonAxisChart.PieChart2D;
import org.jCharts.properties.AxisProperties;
import org.jCharts.properties.BarChartProperties;
import org.jCharts.properties.ChartProperties;
import org.jCharts.properties.DataAxisProperties;
import org.jCharts.properties.LegendProperties;
import org.jCharts.properties.PieChart2DProperties;
import org.jCharts.properties.PropertyException;
import org.jCharts.types.ChartType;

/**
 * 
 */
public class AccionesCU006EstadisticasPAA extends CohesionAction {
    
/**
     * Called by Struts for the execution of action A_Pre_PrincipalEstadisticasPAA.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_PrincipalEstadisticasPAA(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_PrincipalEstadisticasPAA", };
        final int SALIDA_0 = 0;

        int salida = SALIDA_0;
//Checking for actors encargado_prd, encargado_pai, encargado_paa, director_DDP, encargado_pas
            if (!CohesionActor.checkActor(request, 62)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            /*Comienza nuestro codigo*/
            request.getSession().setAttribute("L_Anos", listYears());
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_NroProfPostuladosModalidad.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_NroProfPostuladosModalidad(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_NroProfPostuladosModalidad","A_Pre_PrincipalEstadisticasPAA", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
//Checking for actors encargado_pas, encargado_pai, director_DDP, encargado_prd, encargado_paa
            if (!CohesionActor.checkActor(request, 62)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_EstdPAAModalidad fF_EstdPAAModalidad = (F_EstdPAAModalidad)form;
            /*Empieza nuestro codigo*/
            String modalidad = fF_EstdPAAModalidad.getModalidad();
            int anual = fF_EstdPAAModalidad.getAnual();
            String query = "SELECT DISTINCT profesor.idprofesor, paa.idpaa " +
                           "FROM \"public\".paa AS paa, \"public\".profesor AS profesor " +
                           "WHERE paa.modalidad = '"+ modalidad +"' " +
                           "AND paa.profesor = profesor.idprofesor " +
                           "AND paa.fecha_inicio > '"+String.valueOf(anual)+"-01-01' " +
                           "AND '"+String.valueOf(anual)+"-12-31' >  paa.fecha_inicio";
            String query2 = "SELECT DISTINCT profesor.idprofesor " +
                           "FROM \"public\".paa AS paa, \"public\".profesor AS profesor " +
                           "WHERE paa.modalidad = '"+ modalidad +"' " +
                           "AND paa.profesor = profesor.idprofesor " +
                           "AND paa.fecha_inicio > '"+String.valueOf(anual)+"-01-01' " +
                           "AND '"+String.valueOf(anual)+"-12-31' >  paa.fecha_inicio";
            String query3 = "SELECT DISTINCT profesor.idprofesor " +
                           "FROM \"public\".paa AS paa, \"public\".profesor AS profesor " +
                           "WHERE paa.profesor = profesor.idprofesor";
            String query5 = "SELECT profesor.idprofesor " +
                           "FROM \"public\".paa AS paa, \"public\".profesor AS profesor " +
                           "WHERE paa.modalidad = '"+ modalidad +"' " +
                           "AND paa.profesor = profesor.idprofesor " +
                           "AND paa.fecha_inicio > '"+String.valueOf(anual)+"-01-01' " +
                           "AND '"+String.valueOf(anual)+"-12-31' >  paa.fecha_inicio";
            List<Object[]> idsProfPaa = (List<Object[]>)s.createSQLQuery(query).list();
            List<BigInteger> idsProf = (List<BigInteger>)s.createSQLQuery(query2).list();
            List<BigInteger> idsProfTotal = (List<BigInteger>)s.createSQLQuery(query3).list();
            List<BigInteger> idsProfWOD = (List<BigInteger>)s.createSQLQuery(query5).list();
            List<Profesor> profs = new ArrayList<Profesor>();
            List<Profesor> profs2 = new ArrayList<Profesor>();
            List<Paa> paas = new ArrayList<Paa>();
            for(Object[] objeto : idsProfPaa){
                profs.add((Profesor)s.load(Profesor.class, Long.parseLong(objeto[0].toString())));
                paas.add((Paa)s.load(Paa.class, Long.parseLong(objeto[1].toString())));
            }
            for(BigInteger objeto : idsProf){
                profs2.add((Profesor)s.load(Profesor.class, objeto.longValue()));
            }
            for(Profesor prof: profs){
                prof.getCategoria();
            }
            for(Paa paa : paas){
                paa.getModalidad();
            }
            String[][] opciones = new String[4][2];
            opciones[0][0] = String.valueOf(anual) + "-" + "01-01";
            opciones[0][1] = String.valueOf(anual) + "-" + "03-31";
            opciones[1][0] = String.valueOf(anual) + "-" + "04-01";
            opciones[1][1] = String.valueOf(anual) + "-" + "06-30";
            opciones[2][0] = String.valueOf(anual) + "-" + "07-01";
            opciones[2][1] = String.valueOf(anual) + "-" + "09-30";
            opciones[3][0] = String.valueOf(anual) + "-" + "10-01";
            opciones[3][1] = String.valueOf(anual) + "-" + "12-31";
            Integer[] numProfTrimestrales = new Integer[4];
            Double[] porcNumProfTrimestrales = new Double[4];
            for(int i = 0; i<4; i++){
                String query4 = "SELECT profesor.idprofesor " +
                           "FROM \"public\".paa AS paa, \"public\".profesor AS profesor " +
                           "WHERE paa.modalidad = '"+ modalidad +"' " +
                           "AND paa.profesor = profesor.idprofesor " +
                           "AND paa.fecha_inicio > '"+opciones[i][0]+"' " +
                           "AND '"+opciones[i][1]+"' >  paa.fecha_inicio";
                List<Integer> profTrimestrales = (List<Integer>)s.createSQLQuery(query4).list();
                if(profTrimestrales.size() > 0){
                    numProfTrimestrales[i] = profTrimestrales.size();
                }else if(profTrimestrales.size() == 0){
                    numProfTrimestrales[i] = 0;
                }
                porcNumProfTrimestrales[i] = Math.round(((numProfTrimestrales[i] / Long.valueOf(String.valueOf(idsProfWOD.size())).doubleValue())*100)*Math.pow(10,2))/Math.pow(10,2);
            }
            String numProfs = "El número de profesores postulados en " + modalidad;
            if(modalidad.equals("Taller")){
                numProfs += "es ";
            }else{
                numProfs += "s ";
            }
            if(profs2.isEmpty()){
                salida = SALIDA_1;
            }
            numProfs += "es de: " + String.valueOf(profs2.size());
            numProfs += " y son los siguientes: ";
            Long total = Long.valueOf(String.valueOf(idsProfTotal.size()));
            Double porcentaje = (profs2.size() / total.doubleValue())*100;
            porcentaje = Math.round(porcentaje*Math.pow(10,2))/Math.pow(10,2);
            String porcetProf = "Hay "+String.valueOf(profs2.size());
            porcetProf += " profesores postulados en "+modalidad+" de un total de "+String.valueOf(idsProfTotal.size());
            porcetProf += " lo que representa un "+String.valueOf(porcentaje);
            porcetProf += "% de la problacion total de profesores postulados al PAA en la historia";
            double [] porcTotalesHist = new double[2];
            porcTotalesHist[0] = porcentaje;
            porcTotalesHist[1] = 100.00 - porcentaje;
            request.getSession().setAttribute("porcetProf", porcetProf);
            request.getSession().setAttribute("numProfs", numProfs);
            request.getSession().setAttribute("L_Profesor", profs2);
            request.getSession().setAttribute("L_Paa", paas);
            request.getSession().setAttribute("numProfTrimestrales", numProfTrimestrales);
            request.getSession().setAttribute("porcNumProfTrimestrales", porcNumProfTrimestrales);
            request.getSession().setAttribute("year", anual);
            request.getSession().setAttribute("porcTotalHist",porcTotalesHist);
            request.getSession().setAttribute("opcion", 1);

            request.getSession().setAttribute("baosPDF", generarPDFProfPostMod(request));

            fF_EstdPAAModalidad.reset(mapping, request);
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==1) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_Pre_NroProfPostuladosModalidad.msg1"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_Pre_NroProfEnModalidadEnEstilo.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    public ActionForward A_Pre_NroProfEnModalidadEnEstilo(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Salidas
        final String[] SALIDAS = {"V_NroProfEnModalidadEnEstilo","A_Pre_PrincipalEstadisticasPAA", };
        final int SALIDA_0 = 0;
        final int SALIDA_1 = 1;

        int salida = SALIDA_0;
//Checking for actors encargado_prd, encargado_pas, director_DDP, encargado_paa, encargado_pai
            if (!CohesionActor.checkActor(request, 62)) {
                return mapping.findForward(CohesionActor.SALIDA_ACTOR);
            }
        Session s = HibernateUtil.getCurrentSession();
        Transaction tr = s.beginTransaction();
        try {
            F_EstdPAAModalidadEstilo fF_EstdPAAModalidadEstilo = (F_EstdPAAModalidadEstilo)form;
            /*Comienza nuestro codigo*/
            String modalidad = fF_EstdPAAModalidadEstilo.getModalidad();
            String destino = fF_EstdPAAModalidadEstilo.getDestino();

            String query = "SELECT DISTINCT profesor.idprofesor " +
                           "FROM \"public\".paa AS paa, \"public\".profesor AS profesor " +
                           "WHERE paa.fecha_inicio <= CURRENT_DATE " +
                             "AND CURRENT_DATE <= paa.fecha_culminacion " +
                             "AND paa.modalidad = '"+ modalidad +"' ";
            if(destino.equals("Nacional")){
                query += "AND paa.pais = 'Venezuela' " +
                         "AND paa.profesor = profesor.idprofesor";
            }else if(destino.equals("Internacional")){
                query += "AND paa.pais != 'Venezuela' " +
                         "AND paa.profesor = profesor.idprofesor";
            }
            String query2 = "SELECT DISTINCT profesor.idprofesor " +
                           "FROM \"public\".paa AS paa, \"public\".profesor AS profesor " +
                           "WHERE paa.fecha_inicio <= CURRENT_DATE " +
                             "AND CURRENT_DATE <= paa.fecha_culminacion " +
                             "AND paa.profesor = profesor.idprofesor";
            List<BigInteger> idsProf = (List<BigInteger>)s.createSQLQuery(query).list();
            List<BigInteger> idsProfTotal = (List<BigInteger>)s.createSQLQuery(query2).list();
            List<Profesor> profs = new ArrayList<Profesor>();
//            List<Paa> paas = new ArrayList<Paa>();
            for(BigInteger objeto : idsProf){
                profs.add((Profesor)s.load(Profesor.class, objeto.longValue()));
//                paas.add((Paa)s.load(Paa.class, Long.parseLong(objeto[1].toString())));
            }
            for(Profesor prof: profs){
                prof.getCategoria();
            }
//            for(Paa paa : paas){
//                paa.getModalidad();
//            }
            String numProfs = "El número de profesores en " + modalidad;
            if(modalidad.equals("Taller")){
                numProfs += "es ";
            }else{
                numProfs += "s ";
            }
            if(profs.isEmpty()){
                salida = SALIDA_1;
            }
            numProfs += destino + "es es de: " + String.valueOf(profs.size());
            numProfs += " y son los siguientes: ";
            Long total = Long.valueOf(String.valueOf(idsProfTotal.size()));
            Double porcentaje = (profs.size() / total.doubleValue())*100;
            porcentaje = Math.round(porcentaje*Math.pow(10,2))/Math.pow(10,2);
            String porcetProf = "Hay "+String.valueOf(profs.size());
            porcetProf += " profesores haciendo "+modalidad+"s "+destino+"es de un total de "+String.valueOf(idsProfTotal.size());
            porcetProf += " lo que representa un "+String.valueOf(porcentaje);
            porcetProf += "% de la problacion total de profesores con un registro de PAA activo";
            request.getSession().setAttribute("porcetProf", porcetProf);
            request.getSession().setAttribute("numProfs", numProfs);
            request.getSession().setAttribute("L_Profesor", profs);
            request.getSession().setAttribute("opcion", 2);
            request.getSession().setAttribute("baosPDF", generarPDFProfPostModEst(request));
//            request.getSession().setAttribute("L_Paa", paas);
            fF_EstdPAAModalidadEstilo.reset(mapping, request);
            /*Termina nuestro codigo*/
            tr.commit();

        } catch (Exception ex) {
            tr.rollback();
            throw ex;
        } finally {
            try { s.close(); } catch (Exception ex2) {}
        }
        if (salida==1) {
          request.setAttribute("msg",
            getResources(request).getMessage("A_Pre_NroProfEnModalidadEnEstilo.msg1"));
        }

        return mapping.findForward(SALIDAS[salida]);
    }

/**
     * Called by Struts for the execution of action A_GenerarPDFProfPostMod.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    private ByteArrayOutputStream generarPDFProfPostMod(HttpServletRequest request)
            throws Exception {
        List<Profesor> L_Profesor = (List<Profesor>) request.getSession().getAttribute("L_Profesor");
        Double[] porcNumProfTrimestrales = (Double[]) request.getSession().getAttribute("porcNumProfTrimestrales");
        Integer[] numProfTrimestrales = (Integer[]) request.getSession().getAttribute("numProfTrimestrales");
        String mensaje = (String) request.getSession().getAttribute("porcetProf");
        int year = (Integer) request.getSession().getAttribute("year");
        double[] porcTotalesHist = (double[]) request.getSession().getAttribute("porcTotalHist");
        String nombrePDF = "PAA - Número de Profesores Postulados al PAA en " + String.valueOf(year);
        request.getSession().setAttribute("nombrePDF", nombrePDF);
        String tituloPDF = "PAA - Número de Profesores Postulados al PAA en " + String.valueOf(year);
        String tablaResumen = "Número de profesores Postulados al PAA en el año " + String.valueOf(year);
        String nombreGraphBarra = "Número de profesores Postulados al PAA en el año " + String.valueOf(year);
        String nombrePieGraph = "Porción de profesores postulados al PAA";
        String[] etiqPie = new String[porcTotalesHist.length];
        etiqPie[0] = "Profesores postulados en " + String.valueOf(year);
        etiqPie[1] = "Profesores postulados en otros años";


        // Nuevo documento PDF con la pagina horizontal
        Document document = new Document(PageSize.LETTER.rotate());
        ByteArrayOutputStream baosPDF = new ByteArrayOutputStream();
        PdfWriter.getInstance(document, baosPDF);
        document.open();

        //Seteo de la cebolla
        URL base = this.getClass().getResource("");
        String path = new File(base.getFile(), "/../../../../../css/images/Cebolla001tr.gif").getCanonicalPath();
        GifImage img = new GifImage(path);
        int frame_count = img.getFrameCount();
        for (int i = 1; i <= frame_count; i++) {
            document.add(img.getImage(i));
        }

        //Seteo Membrete
        document.add(new Paragraph("Universidad Simón Bolívar\nDepartamento de Desarrollo Profesoral\n"
                + "Programa Actualización Académica"));

        //Seteo el titulo y lo agrego al documento
        Paragraph title = new Paragraph(tituloPDF, FontFactory.getFont(FontFactory.HELVETICA, 18, Font.BOLD));
        title.setAlignment(Element.ALIGN_CENTER);
        title.setSpacingAfter(25);
        document.add(title);


        //Defino las relaciones de tamano entre las columnas
        float[] anchos = new float[10];
        anchos[0] = 12;//Apellidos
        anchos[1] = 12;//Nombres
        anchos[2] = 9;//Cedula
        anchos[3] = 5;//Edad
        anchos[4] = 15;//Email
        anchos[5] = 10;//Categoria
        anchos[6] = 10;//Division
        anchos[7] = 13;//Departamen
        anchos[8] = 15;//Fecha ingresa USB
        anchos[9] = 10;//Novel

        //Creo la tabla
        PdfPTable table = new PdfPTable(10);
        table.setWidthPercentage(100);
        table.setWidths(anchos);

        //Anado los headers a la tabla
        table.addCell("Apellidos");
        table.addCell("Nombres");
        table.addCell("Cédula");
        table.addCell("Edad");
        table.addCell("Email");
        table.addCell("Categoría");
        table.addCell("División");
        table.addCell("Departamento");
        table.addCell("Fecha de ingreso USB");
        table.addCell("¿Es novel?");

        //Agrego los datos a la tabla
        for (int i = 0; i < L_Profesor.size(); i++) {
            Profesor prof = L_Profesor.get(i);
            table.addCell(prof.getPrimerApellido() + " " + prof.getSegundoApellido());//Apellidos
            table.addCell(prof.getPrimerNombre() + " " + prof.getSegundoNombre());//Nombres
            table.addCell(Integer.toString(prof.getCi()));//Cedula
            table.addCell(prof.getEdad());//Edad
            table.addCell(prof.getCorreo());//Email
            table.addCell(prof.getCategoria());//Categoria
            table.addCell(prof.getDivision());//Division
            table.addCell(prof.getDepartamento());//Departamento
            table.addCell(prof.getFec_Ing_USB().toString());//Fecha ingreso usb
            if (prof.getNovel()) {
                table.addCell("Si");
            } else {
                table.addCell("No");
            }
        }
        // Agrego la tabla creada al documento
        document.add(table);

        Paragraph title1 = new Paragraph(tablaResumen);
        title1.setAlignment(Element.ALIGN_CENTER);
        title1.setSpacingAfter(25);
        document.add(title1);


        //Defino las relaciones de tamano entre las columnas
        float[] anchos1 = new float[4];
        anchos1[0] = 19;//Enero-Marzo
        anchos1[1] = 19;//Abril-Junio
        anchos1[2] = 19;//Julio-Septiembre
        anchos1[3] = 19;//Octubre-Diciembre

        //Creo la tabla
        PdfPTable table1 = new PdfPTable(4);
        table1.setWidthPercentage(100);
        table1.setWidths(anchos1);

        //Anado los headers a la tabla
        table1.addCell("Enero - Marzo");
        table1.addCell("Abril - Junio");
        table1.addCell("Julio - Septiembre");
        table1.addCell("Octubre - Diciembre");

        //Agrego los datos a la tabla
        table1.addCell(numProfTrimestrales[0].toString() + " profs.");
        table1.addCell(numProfTrimestrales[1].toString() + " profs.");
        table1.addCell(numProfTrimestrales[2].toString() + " profs.");
        table1.addCell(numProfTrimestrales[3].toString() + " profs.");
        table1.addCell(porcNumProfTrimestrales[0].toString() + "%");
        table1.addCell(porcNumProfTrimestrales[1].toString() + "%");
        table1.addCell(porcNumProfTrimestrales[2].toString() + "%");
        table1.addCell(porcNumProfTrimestrales[3].toString() + "%");
        document.add(table1);
        document.add(new Paragraph("Porcentajes calculados en relación al año " + String.valueOf(year)));
        document.add(new Paragraph(mensaje));

        //Seteo los datos del grafico
        String yTitle = "Porcentaje de Profesores";
        String xTitle = "Trimestres del año " + String.valueOf(year);
        String graphTitle = nombreGraphBarra;
        String[] xLabels = new String[4];
        xLabels[0] = "Ene-Mar";
        xLabels[1] = "Abr-Jun";
        xLabels[2] = "Jul-Sep";
        xLabels[3] = "Oct-Dic";
        double[][] datos = new double[1][porcNumProfTrimestrales.length];
        for (int i = 0; i < porcNumProfTrimestrales.length; i++) {
            datos[0][i] = porcNumProfTrimestrales[i];
        }
        String[] leyendaLabels = new String[datos.length];
        leyendaLabels[0] = "Porcentaje de profesores que culminaron el Año Sabático";
        double[] dataPie = new double[porcTotalesHist.length];
        for (int i = 0; i < porcTotalesHist.length; i++) {
            dataPie[i] = porcTotalesHist[i];
        }
        String[] labelsPie = etiqPie;
        String pieTitle = nombrePieGraph;
        contruirGrafico(yTitle, xTitle, graphTitle, xLabels, datos, leyendaLabels, document, dataPie, labelsPie, pieTitle,request);

        document.close();
        return baosPDF;
    }

/**
     * Called by Struts for the execution of action A_GenerarPDFProfPostModEst.
     * 
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @return The Struts name of the following step.
     * @throws java.lang.Exception For untreated exceptions. 
     * These exceptios will normally be treated with 
     * the default exception action.
     */
    private ByteArrayOutputStream generarPDFProfPostModEst(HttpServletRequest request)
            throws Exception {
            List<Profesor> L_Profesor = (List<Profesor>)request.getSession()
                    .getAttribute("L_Profesor");
             String mensaje = (String)request.getSession().getAttribute("porcetProf");
             String nombrePDF = "PAA - Número de Profesores con una actividad actual en el PAA";
             request.getSession().setAttribute("nombrePDF", nombrePDF);
             String tituloPDF = "PAA - Número de Profesores con una actividad actual en el PAA";

            Document document = new Document(PageSize.LETTER.rotate());
            ByteArrayOutputStream baosPDF = new ByteArrayOutputStream();
            PdfWriter.getInstance(document, baosPDF);
                document.open();

                //Seteo de la cebolla
                URL base = this.getClass().getResource("");
                String path = new File(base.getFile(), "/../../../../../css/images/Cebolla001tr.gif").getCanonicalPath();
                GifImage img = new GifImage(path);
                int frame_count = img.getFrameCount();
                for(int i = 1; i <= frame_count; i++){
                    document.add(img.getImage(i));
                }

                //Seteo Membrete
                document.add(new Paragraph("Universidad Simón Bolívar\nDepartamento de Desarrollo Profesoral\n" +
                                           "Programa Actualización Académica"));

                //Seteo el titulo y lo agrego al documento
                Paragraph title = new Paragraph(tituloPDF, FontFactory.getFont(FontFactory.HELVETICA, 18, Font.BOLD));
                title.setAlignment(Element.ALIGN_CENTER);
                title.setSpacingAfter(25);
                document.add(title);


                //Defino las relaciones de tamano entre las columnas
                float[] anchos = new float[10];
                anchos[0] = 12;//Apellidos
                anchos[1] = 12;//Nombres
                anchos[2] = 9;//Cedula
                anchos[3] = 5;//Edad
                anchos[4] = 15;//Email
                anchos[5] = 10;//Categoria
                anchos[6] = 10;//Division
                anchos[7] = 13;//Departamen
                anchos[8] = 15;//Fecha ingresa USB
                anchos[9] = 10;//Novel

                //Creo la tabla
                PdfPTable table = new PdfPTable(10);
                table.setWidthPercentage(100);
                table.setWidths(anchos);

                //Anado los headers a la tabla
                table.addCell("Apellidos");
                table.addCell("Nombres");
                table.addCell("Cédula");
                table.addCell("Edad");
                table.addCell("Email");
                table.addCell("Categoría");
                table.addCell("División");
                table.addCell("Departamento");
                table.addCell("Fecha de ingreso USB");
                table.addCell("¿Es novel?");

                //Agrego los datos a la tabla
                for (int i = 0; i<L_Profesor.size();i++) {
                    Profesor prof = L_Profesor.get(i);
                    table.addCell(prof.getPrimerApellido() + " " + prof.getSegundoApellido());//Apellidos
                    table.addCell(prof.getPrimerNombre() + " " + prof.getSegundoNombre());//Nombres
                    table.addCell(Integer.toString(prof.getCi()));//Cedula
                    table.addCell(prof.getEdad());//Edad
                    table.addCell(prof.getCorreo());//Email
                    table.addCell(prof.getCategoria());//Categoria
                    table.addCell(prof.getDivision());//Division
                    table.addCell(prof.getDepartamento());//Departamento
                    table.addCell(prof.getFec_Ing_USB().toString());//Fecha ingreso usb
                    if(prof.getNovel()){
                        table.addCell("Si");
                    }else{
                        table.addCell("No");
                    }
                }
                // Agrego la tabla creada al documento
                document.add(table);
                document.add(new Paragraph(mensaje));
            document.close();
            return baosPDF;
    }
    
    private List listYears() {
        Date actualDate = new Date();
        LinkedList listYears = new LinkedList();
        int year = actualDate.getYear() + 1900;
        for (int i = year - 110; i <= year + 20; i++) {
            listYears.add(i);
        }
        return listYears;
    }

        private void contruirGrafico(String yTitle, String xTitle, String GraphTitle, String[] xLabels, double[][] datos,
                                     String[] leyendaLabels, Document document, double[] dataPie, String[] labelsPie,
                                     String pieTitle, HttpServletRequest request) throws Exception{
            try{
                //Grafico de barras
                BarChartProperties barChartProperties = new BarChartProperties();
                LegendProperties legendProperties = new LegendProperties();
                ChartProperties chartProperties = new ChartProperties();
                AxisProperties axisProperties = new AxisProperties( false );

                int width = 550;
                int height = 360;

                DataAxisProperties dataAxisProperties = (DataAxisProperties) axisProperties.getYAxisProperties();

                try {
                    double max = 0.0;
                    for(int i = 0; i < datos.length; i++){
                        for(int j = 0; j < datos[i].length; j++){
                            if(max < datos[i][j]){
                                max = datos[i][j];
                            }
                        }
                    }
                    int maxInt = (int)max;
                    dataAxisProperties.setNumItems(5);
                    dataAxisProperties.setUserDefinedScale(0, 25);
                }
                catch( PropertyException propertyException ){
                    propertyException.printStackTrace();
                }

                dataAxisProperties.setRoundToNearest( 0 );

                ValueLabelRenderer valueLabelRenderer = new ValueLabelRenderer( false, false, true, -1 );
                valueLabelRenderer.setValueLabelPosition( ValueLabelPosition.ON_TOP );
                valueLabelRenderer.useVerticalLabels( false );
                barChartProperties.addPostRenderEventListener( valueLabelRenderer );

                String yAxisTitle = yTitle;
                String xAxisTitle = xTitle;
                String[] xAxisLabels = xLabels;
                String title2 = GraphTitle;
                IAxisDataSeries dataSeries = new DataSeries( xAxisLabels, xAxisTitle, yAxisTitle, title2 );

                double[][] data = datos;
                String[] legendLabels = leyendaLabels;
                Paint[] allPaints = new Paint[]{Color.BLACK,Color.BLUE,Color.CYAN,Color.DARK_GRAY,Color.GRAY,Color.GREEN,Color.LIGHT_GRAY,
                                                Color.MAGENTA,Color.ORANGE,Color.PINK,Color.RED,Color.WHITE,Color.YELLOW};
                Paint[] paints = new Paint[data.length];
                for(int i = 0; i < data.length; i++){
                    paints[i] = allPaints[i];
                }
                dataSeries.addIAxisPlotDataSet( new AxisChartDataSet( data, legendLabels, paints, ChartType.BAR, barChartProperties ) );

                AxisChart axisChart = new AxisChart( dataSeries, chartProperties, axisProperties, legendProperties, width, height );
                request.getSession().setAttribute("GraficoBarra", axisChart);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                JPEGEncoder.encode(axisChart, 1.0f, baos);

                Image barChartImage = Image.getInstance(baos.toByteArray());

                document.add(barChartImage);


                //Grafica de torta
                double[] data1= dataPie;
                String[] labels= labelsPie;
                Paint[] allPaints1= new Paint[]{Color.BLACK,Color.BLUE,Color.CYAN,Color.DARK_GRAY,Color.GRAY,Color.GREEN,Color.LIGHT_GRAY,
                                                Color.MAGENTA,Color.ORANGE,Color.PINK,Color.RED,Color.WHITE,Color.YELLOW};
                Paint[] paints1 = new Paint[data1.length];
                for(int i = 0; i < data1.length; i++){
                    paints1[i] = allPaints1[i];
                }

                PieChart2DProperties pieChart2DProperties= new PieChart2DProperties();
                PieChartDataSet pieChartDataSet= new PieChartDataSet(pieTitle, data1, labels, paints1, pieChart2DProperties );

                PieChart2D pieChart2D= new PieChart2D( pieChartDataSet, new LegendProperties(), new ChartProperties(), width, height );
                request.getSession().setAttribute("GraficoPie", pieChart2D);
                ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
                PNGEncoder.encode(pieChart2D, baos2);
                Image pieChartImage = Image.getInstance(baos2.toByteArray());
                document.add(pieChartImage);

                } catch (Exception ex) {
                    throw ex;
                }
        }


     public void A_PDFEstadisticaPAA(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        String nombrePDF = (String) request.getSession().getAttribute("nombrePDF");
        ByteArrayOutputStream baosPDF = (ByteArrayOutputStream) request.getSession().getAttribute("baosPDF");

        // Le indico al Servlet que voy a enviar un archivo pdf
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", " attachment; filename=\"" + nombrePDF + ".pdf\"");

        baosPDF.writeTo(response.getOutputStream());
    }

     public void A_GraficoEstadisticaPAA(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        String tipoGrafica = request.getParameter("tipoGrafica");
        if(tipoGrafica.equals("GraficoBarra")){
            AxisChart axisChart = (AxisChart)request.getSession().getAttribute("GraficoBarra");
            ServletEncoderHelper.encodePNG(axisChart, response);
        }else if(tipoGrafica.equals("GraficoPie")){
            PieChart2D pieChart2D = (PieChart2D)request.getSession().getAttribute("GraficoPie");
            ServletEncoderHelper.encodePNG(pieChart2D, response);
        }
    }


}